const http = require('http');
const createApp = require('./app');
const config = require('./config');

/**
 * 创建Express应用实例
 */
const app = createApp();

/**
 * 创建HTTP服务器
 */
const server = http.createServer(app);

/**
 * 服务器端口
 */
const PORT = config.app.port;

/**
 * 启动服务器
 */
async function startServer() {
  try {
    // 初始化数据库
    await app.initializeDatabase();
    
    // 启动HTTP服务器
    server.listen(PORT, () => {
      console.log(`✅ 服务器启动成功！`);
      console.log(`🔗 服务地址: http://localhost:${PORT}`);
      console.log(`🔍 API根路径: http://localhost:${PORT}${config.app.apiPrefix}`);
      console.log(`💚 健康检查: http://localhost:${PORT}/health`);
      console.log(`🌐 环境: ${config.app.environment}`);
    });
    
    // 处理服务器错误
    server.on('error', (error) => {
      if (error.syscall !== 'listen') {
        throw error;
      }
      
      // 处理不同类型的错误
      switch (error.code) {
        case 'EACCES':
          console.error(`端口 ${PORT} 需要管理员权限`);
          process.exit(1);
          break;
        case 'EADDRINUSE':
          console.error(`端口 ${PORT} 已被占用`);
          process.exit(1);
          break;
        default:
          throw error;
      }
    });
    
    // 处理服务器关闭
    server.on('close', () => {
      console.log('服务器已关闭');
    });
    
  } catch (error) {
    console.error('启动服务器失败:', error);
    process.exit(1);
  }
}

/**
 * 优雅关闭服务器
 */
function gracefulShutdown() {
  console.log('正在优雅关闭服务器...');
  
  // 设置超时，确保关闭过程不会无限等待
  const timeoutId = setTimeout(() => {
    console.error('强制关闭服务器');
    process.exit(1);
  }, 10000);
  
  // 关闭HTTP服务器
  server.close((err) => {
    clearTimeout(timeoutId);
    
    if (err) {
      console.error('关闭服务器时出错:', err);
      process.exit(1);
    }
    
    // 触发应用关闭事件
    app.emit('close');
    
    console.log('服务器已优雅关闭');
    process.exit(0);
  });
}

/**
 * 注册信号处理程序
 * 处理进程终止信号
 */
function registerSignalHandlers() {
  // 处理SIGINT信号（Ctrl+C）
  process.on('SIGINT', () => {
    console.log('接收到中断信号，正在关闭服务器...');
    gracefulShutdown();
  });
  
  // 处理SIGTERM信号（kill命令）
  process.on('SIGTERM', () => {
    console.log('接收到终止信号，正在关闭服务器...');
    gracefulShutdown();
  });
  
  // 处理未捕获的异常
  process.on('uncaughtException', (error) => {
    console.error('未捕获的异常:', error);
    gracefulShutdown();
  });
  
  // 处理未处理的Promise拒绝
  process.on('unhandledRejection', (reason, promise) => {
    console.error('未处理的Promise拒绝:', reason);
    gracefulShutdown();
  });
}

/**
 * 主函数
 */
async function main() {
  try {
    console.log('正在启动Harmony Node.js服务器...');
    
    // 注册信号处理程序
    registerSignalHandlers();
    
    // 启动服务器
    await startServer();
    
  } catch (error) {
    console.error('启动失败:', error);
    process.exit(1);
  }
}

// 启动应用
if (require.main === module) {
  main();
}

// 导出服务器相关对象和函数
module.exports = {
  server,
  startServer,
  gracefulShutdown,
  registerSignalHandlers
};